# crud_user.py
# 针对 User 模型的数据库操作（增删改查）

from sqlalchemy.orm import Session
from app.models.user import User  # 导入 SQLAlchemy 模型
from app.schemas.user import UserCreate  # 导入 Pydantic Schema，用于接收创建数据

# 假设您在 core 目录中有一个处理密码安全的模块
from app.core.security import get_password_hash

# --- READ (读取) 操作 ---


def get(db: Session, id: int) -> User | None:
    """
    根据 ID 获取单个用户
    """
    # db.query(User) - 表示我们要查询 User 模型对应的表
    # .filter(User.id == id) - 这就是 SQL 中的 WHERE 子句
    # .first() - 获取查询到的第一个结果，如果没找到则返回 None
    return db.query(User).filter(User.id == id).first()


def get_by_email(db: Session, *, email: str) -> User | None:
    """
    根据 email 获取单个用户
    """
    return db.query(User).filter(User.email == email).first()


def get_multi(db: Session, *, skip: int = 0, limit: int = 100) -> list[User]:
    """
    获取用户列表（支持分页）
    """
    # .offset(skip) - 跳过指定数量的记录
    # .limit(limit) - 最多返回指定数量的记录
    # .all() - 获取所有匹配的记录并以列表形式返回
    return db.query(User).offset(skip).limit(limit).all()


# --- CREATE (创建) 操作 ---


def create(db: Session, *, obj_in: UserCreate) -> User:
    """
    创建一个新用户
    :param db: 数据库会话
    :param obj_in: 符合 UserCreate schema 的 Pydantic 对象
    """
    # 1. 将 Pydantic schema 对象转换为字典
    #    注意：我们永远不应该直接信任并存储用户的明文密码
    create_data = obj_in.model_dump()

    # 2. 从字典中取出明文密码，并用哈希函数处理它
    plain_password = create_data.pop("password")
    create_data["hashed_password"] = get_password_hash(plain_password)

    # 3. 使用处理后的数据，创建一个 SQLAlchemy User 模型实例
    db_obj = User(**create_data)

    # 4. 将新创建的对象添加到数据库会话中
    db.add(db_obj)

    # 5. 提交事务，将改动保存到数据库
    db.commit()

    # 6. 刷新对象，以获取数据库自动生成的数据（比如自增的 id）
    db.refresh(db_obj)

    return db_obj
